package com.ruge.core.tool;

import com.ruge.core.error.BaseError;
import com.ruge.core.exception.BaseBusinessException;
import com.ruge.core.exception.IError;
import com.ruge.tool.base.BaseEnum;
import com.ruge.tool.json.JsonTool;
import com.ruge.tool.str.StringTool;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * description: 断言工具类
 * create time at 2022/6/6 11:26
 *
 * @author alice.ruge
 * @since 0.0.3
 */

public class AssertTool {

    public static void mustValid(Object obj) {
        Boolean isValid = (Boolean) JsonTool.getObjToMap(obj).get("isValid");
        mustTrue(isValid, "对象无效:" + obj);
    }

    /**
     * 对象必须非空
     *
     * @param obj     对象
     * @param message 提示信息
     */
    public static void mustNotBlack(Object obj, String message) {
        if (StringTool.isBlank(obj)) {
            execute(message, Option.IS_NOT_BLACK);
        }
    }

    /**
     * 对象必须非空
     *
     * @param obj    对象
     * @param iError 异常信息
     */
    public static void mustNotBlack(Object obj, IError iError) {
        if (StringTool.isBlank(obj)) {
            throw new BaseBusinessException(iError);
        }
    }

    /**
     * 对象必须为真
     *
     * @param isTrue  对象必须为真
     * @param message 提示信息
     */
    public static void mustTrue(boolean isTrue, String message) {
        if (!isTrue) {
            execute(message, Option.IS_TRUE);
        }
    }

    /**
     * 对象必须为真
     *
     * @param isTrue 对象必须为真
     * @param iError 提示信息
     */
    public static void mustTrue(boolean isTrue, IError iError) {
        if (!isTrue) {
            throw new BaseBusinessException(iError);
        }
    }

    /**
     * 最终执行方法
     *
     * @param message 提示信息
     * @param option  判断类型
     */
    private static void execute(String message, Option option) {
        Map<String, String> extMessage = new HashMap<>(16);
        extMessage.put("message", message);
        extMessage.put("option", option.toString());
        throw new BaseBusinessException(BaseError.ASSERT_FAILED, JsonTool.getObjToJson(extMessage));
    }


    @Getter
    @AllArgsConstructor
    public static enum Option implements BaseEnum {
        /**
         * 断言判断
         */
        IS_NOT_BLACK("IS_NOT_BLACK", "必须不为空"),
        IS_TRUE("IS_TRUE", "必须为true"),
        ;
        private String code;
        private String desc;
    }
}
